package com.github.limit.persistence;

import com.github.limit.entity.LimitData;
import com.github.limit.util.LimitUtils;

import java.util.List;

/**
 * @author: wangdejun
 * @create: 2019-10-16 16:27
 **/
public abstract class AbstractAccessLimit implements IAccessLimit {

    /**
     * 获取value
     *
     * @param prefixKey
     * @param key
     * @return
     */
    @Override
    public final int getCount(String prefixKey, String key) {
        prefixKey = LimitUtils.replaceAndSbuLast(prefixKey);
        key = LimitUtils.replaceAndSbuLast(key);
        return doGetCount(prefixKey, key);
    }

    /**
     * 增加1
     *
     * @param prefixKey
     * @param key
     */
    @Override
    public final void increase(String prefixKey, String key) {
        prefixKey = LimitUtils.replaceAndSbuLast(prefixKey);
        key = LimitUtils.replaceAndSbuLast(key);
        doIncrease(prefixKey, key);
    }

    /**
     * 根据前缀获取持久化的限流数据
     *
     * @param prefixKey
     * @return
     */
    @Override
    public final List<LimitData> limitDataList(String prefixKey) {
        prefixKey = LimitUtils.replaceAndSbuLast(prefixKey);
        return dataList(prefixKey);
    }


    /**
     * 获取总数，由子类去实现
     *
     * @param prefixKey
     * @param key
     * @return
     */
    public abstract int doGetCount(String prefixKey, String key);


    /**
     * 增加次数
     *
     * @param prefixKey
     * @param key
     */
    public abstract void doIncrease(String prefixKey, String key);

    /**
     * 获取存储的数据
     *
     * @param prefixKey
     */
    public abstract List<LimitData> dataList(String prefixKey);
}
